// 前提：主线程比子线程晚退出
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
#include <linux/input.h>
#include <dirent.h>
#include <string.h>
#include "yuvcamera.h"

// BMP格式头规范
struct bitmap_header
{
int16_t type;
int32_t size; // 图像文件大小
int16_t reserved1;
int16_t reserved2;
int32_t offbits; // bmp图像数据偏移量
int32_t struct_size;   // 本结构大小
int32_t width;  // 图像宽
int32_t height; // 图像高
int16_t planes;
int16_t bit_count; // 色深
int32_t compression;
int32_t size_img; // bmp数据大小，必须是4的整数倍
int32_t X_pel;
int32_t Y_pel;
int32_t clrused;
int32_t clrImportant;
}__attribute__((packed));

/*****************************************************
 * 功能：       检阅bmp头结点信息
 * header：     bmp格式头规范指针
 * 备注:        无
******************************************************/
void bmp_header_show(struct bitmap_header* header){
    printf("type=%s\n",&header->type); //BM
    printf("size=%d\n",header->size); //图像文件大小 54+像素大小
    printf("reserved1=%d\n",header->reserved1);
    printf("reserved2=%d\n",header->reserved2);
    printf("offbits=%d\n",header->offbits); // bmp图像数据偏移量
    printf("struct_size=%d\n",header->struct_size);   // 本结构大小  
    printf("width=%d\n",header->width);  // 图像宽
    printf("height=%d\n",header->height); // 图像高
    printf("planes=%d\n",header->planes);
    printf("bit_count=%d\n",header->bit_count); // 色深24
    printf("compression=%d\n",header->compression);//赋值为0
    printf("size_img=%d\n",header->size_img); // bmp数据大小，必须是4的整数倍
    printf("X_pel=%d\n",header->X_pel);         //x方向上的像素
    printf("Y_pel=%d\n",header->Y_pel);         //y方向上的像素
    printf("clrused=%d\n",header->clrused);
    printf("clrImportant=%d\n",header->clrImportant);
}

// 宏定义------LED灯
#define LED0_ON   _IO('k',0)
#define LED0_OFF  _IO('K',1)
#define LED1_ON   _IO('k',2)
#define LED1_OFF  _IO('K',3)
#define LED2_ON   _IO('k',4)
#define LED2_OFF  _IO('K',5)
#define LED3_ON   _IO('k',6)
#define LED3_OFF  _IO('K',7)

// 宏定义------蜂鸣器
#define BEEP_ON   _IO('j',0)
#define BEEP_OFF  _IO('j',1)

// 宏定义------文件路径
#define LCD_PATH "/dev/fb0"
#define TOUCH_PATH "/dev/input/event0"
#define ROOT_PATH "/"
#define IIC_PATH  "/dev/IIC_drv"
#define LED_PATH  "/dev/led"
#define BEEP_PATH "/dev/beep"
#define AVI_PATH "/usr/bin"
#define CAMERAPATH "/dev/video7"

// 宏定义------事件
#define UP    1
#define DOWN  2
#define LEFT  3
#define RIGHT 4
#define AXIS  5
#define Us    11
#define Ds    22
#define Ls    33
#define Rs    44
#define Fs    55
#define Bs    66
// #define CWs   77
// #define CCWs  88
// #define Ws    99

// 全局变量声明
int x_endx, y_endy;               // 位移事件，最后一个坐标点读取
int rs;                           // 触控
int re;                           // 手势
int IIC_fd;                       // I2C驱动
int led_fd;                       // led驱动
int beep_fd;                      // 蜂鸣器驱动
int lcd_fd;                       // lcd屏
int touch_fd;                     // event设备
int bmp_fd;                       // 图片加载
int bmp_n;                        // 获取到的图片张数
int avi_n;                        // 获取到的视频个数
int color_black = 0x00000000;     // 黑色
int flag_camera, flag_mv, flag_album, addr;         // 标志位
char lcd[800*480*4] = {0};        // 用于读取图片写入lcd屏
//char lcd_buf[800*480*4] = {0};    // 同上（没用到）
char name[100][256];              // 读取图片文件名：100表示有100个一维数组，256代表一维数组的长度
char name2[100][256];             // 读取视频文件名
char mvavi[128] = {};
struct input_event ts = {};
//int system(const char *command);  // 系统命令格式定义
//int sprintf(char *str, const char *format, ...);  // 字符串拼接格式定义

// 全局变量声明 ------ 事件
int x_start , y_start;	// 坐标的初值
int x_end , y_end;      // 坐标终点
int p;                  // 按下、松开
int MOVE_ABS = 3;       // 位移事件
int PRESS_ABS = 1;      // 压力事件
int P_CLICK_ABS = 330;  // 按键事件
int ABSx = 0;          // x轴坐标
int ABSy = 1;          // y轴坐标

// 全局变量声明 ------ 线程
pthread_t pth_id_touch;     // 触控
//pthread_t pth_id_camera;  // 摄像头
pthread_t pth_id_ss;        // 手势识别
//pthread_t pth_id_mv;      // 视频播放 

// LCD初始化
int lcd_init()
{
    // 打开文件
    lcd_fd = open(LCD_PATH,O_RDWR);// 可读可写打开
    if(lcd_fd < 0)
    {
        perror("lcd文件打开失败\n");
        return -1;
    }
}

// LCD关闭
void lcd_close()
{
    close(lcd_fd);
}

// 触摸屏事件初始化
int touch_init()
{
    touch_fd = open(TOUCH_PATH,O_RDONLY);// 只读打开
    if(touch_fd < 0)
    {
        perror("触摸屏打开失败\n");
        return 0;
    }
}

// 事件关闭
void touch_close()
{
    close(touch_fd);
}

// 图片读取
int bmp_load(const char *bmpname)
{
    bmp_fd = open(bmpname, O_RDWR);
    if(bmp_fd < 0)
    {
        perror("图片打开失败\n");
        return 0;
    }
}

// 图片读取关闭
void bmp_close()
{
    close(bmp_fd);
}

// 颜色填充lcd
int lcd_color(int colorname)
{
    lcd_init();
    
    for(int i = 0; i < 800*480; i++)
    {  
        write(lcd_fd, &colorname, 4); //第三个参数为字节数

    }

    lcd_close();
    
    return 0;
}

// I2C驱动初始化
int IIC_init()
{ 
    // 打开手势识别文件
    IIC_fd = open(IIC_PATH, O_RDWR);
    if(IIC_fd == -1)
    {
        perror("IIC驱动文件打开失败\n");
        return -1;
    }
}

// // led驱动初始化
// int led_init()
// {
//     // 打开LED模块
//     led_fd = open(LED_PATH, O_RDWR);
//     if(led_fd == -1)
//     {
//         perror("LED打开失败\n");
//         return -1;
//     }
//     ioctl(led_fd, LED0_OFF);
//     ioctl(led_fd, LED1_OFF);
//     ioctl(led_fd, LED2_OFF);
//     ioctl(led_fd, LED3_OFF);
// }

// // 蜂鸣器驱动初始化
// int beep_init()
// {
//     // 打开BEEP模块
//     beep_fd = open(BEEP_PATH, O_RDWR);
//     if(beep_fd == -1)
//     {
//         perror("BEEP打开失败\n");
//         return -1;
//     }
// }

// 线程函数 ------  触控事件
void *GetDirection(void *arg)
{
    int touch_fd = *(int *)arg;
    
    while(1)
    {
        // 不停地从event文件中读取数据
        read(touch_fd, &ts, sizeof(struct input_event));
        
        if(ts.type == MOVE_ABS)
        {
            if(ts.code == ABSx)
            {
               x_end = ts.value;
            }
            if(ts.code == ABSy)
            {
               y_end = ts.value;
            }
            // printf("(%d , %d)\n", x_end, y_end);


        }

        // 按键设置
        if(ts.type == PRESS_ABS && ts.code == P_CLICK_ABS)
        {   
            p = ts.value;

            if (p == 0)
            {
            if(x_end - x_start >= 200 && (y_end - y_start) < 50)
            {
               printf("右划 %d\n", RIGHT);
               rs = RIGHT;
            }
            
            else if(x_end - x_start <= -200 && (y_end - y_start) < 50)
            {
               printf("左划 %d\n", LEFT);
               rs = LEFT;
            }

            else if(y_end - y_start >= 100 && (x_end - x_start) < 50)
            {
               printf("下划 %d\n", DOWN);
               rs = DOWN;
            }

            else if(y_end - y_start <= -100 && (x_end - x_start) < 50)
            {
               printf("上划 %d\n", UP);
               rs = UP;
            }
            /*
            if(x_end == x_start && y_end == y_start)
            {
               printf("不划动 %d\n", AXIS);
               rs = AXIS;
            }*/
            }
            
            else
            {
               x_start = x_end;
               y_start = y_end;
               //printf("不划动 %d\n", AXIS);
               rs = AXIS;
               x_endx = x_end;
               y_endy = y_end;
            }

        }
        
        // printf("(%d , %d)\n", x_start, y_start);
        
    }
    // printf("(%d , %d)\n", x_end, y_end);

    pthread_exit(NULL);
}

// 线程函数 ------ 手势识别
void *Gesture(void *arg)
{
    IIC_init();

    //int IIC_fd = *(int *)arg;
    char temp = 0;

    while(1)
    {
        read(IIC_fd, &temp, 1);
        
        // 手势识别模块读取的值在1`9内，如果错误则返回-1
        if(temp>=1 && temp<=9){
            if(temp == 1)
            {
               printf("向上 %d\n", Us);
               re = Us;
            }
            
            else if(temp == 2)
            {
               printf("向下 %d\n", Ds);
               re = Ds;
            }

            else if(temp == 3)
            {   
               printf("向左 %d\n", Ls);
               re = Ls;
            }

            else if(temp == 4)
            {   
               printf("向右 %d\n", Rs);
               re = Rs;
            }

            else if(temp == 5)
            {   
               printf("向前 %d\n", Fs);
               re = Fs;
            }

            else if(temp == 6)
            {
               printf("向后 %d\n", Bs);
               re = Bs;
            }

            // else if(temp == 7)
            // {
            //    printf("顺时针 %d\n", CWs);
            //    re = CWs;
            // }

            // else if(temp == 8)
            // {
            //    printf("逆时针 %d\n", CCWs);
            //    re = CCWs;
            // }
            
            // else if(temp == 9)
            // {
            //    printf("挥手 %d\n", Ws);
            //    re = Ws;
            // }
            
            }
        
    }

    close(IIC_fd);

    pthread_exit(NULL);
}


// 带有坐标的图片（缩放）显示 + 圆角
void bmp_boom_xy(const char *bmpname,     // const 将修饰的变量变成常量，存储地址变为静态变量区
                //int srcx,               // 原图x轴长度
                //int srcy,               // 原图y轴长度
                int destx,                // 缩放后图片的x轴长度
                int desty,                // 缩放后图片的y轴长度
                int startx,               // x起始点
                int starty,               // y起始点
                int r                     // 圆角半径 
){
    lcd_init();
    bmp_load(bmpname);

    // 显示图片信息
    struct bitmap_header header;
    read(bmp_fd, &header, sizeof(struct bitmap_header));
    int srcx = header.width;
    int srcy = header.height;
    // bmp_header_show(&header);

    lseek(bmp_fd, 54 ,SEEK_SET);

    char bmp[srcx*srcy*3]; //报错 ={};
    char zoom_bmp[destx*desty*3]; //报错 ={};
    read(bmp_fd, bmp, srcx*srcy*3); // 文件描述符，缓存区，字节数
    
    // 对bmp图片数据进行缩放
    for(int y=0; y < desty; y++){
        for(int x=0; x < destx; x++){
            zoom_bmp[y*destx*3 + x*3 + 0] = bmp[(srcy*y/desty)*srcx*3 + (srcx*x/destx)*3 + 0];
            zoom_bmp[y*destx*3 + x*3 + 1] = bmp[(srcy*y/desty)*srcx*3 + (srcx*x/destx)*3 + 1];
            zoom_bmp[y*destx*3 + x*3 + 2] = bmp[(srcy*y/desty)*srcx*3 + (srcx*x/destx)*3 + 2];
        }
    }

    int x1 = startx+r;
    int y1 = starty+r;

    int x2 = startx+destx-r;
    int y2 = starty+r;

    int x3 = startx+r;
    int y3 = starty+desty-r;

    int x4 = startx+destx-r;
    int y4 = starty+desty-r;

    
    for(int y=starty; y < 480; y++){
        for(int x=startx; x < 800; x++){
            if(y < desty + starty && x < destx + startx){
              
               if(x<x1 && y<y1 && r<destx/2 && r<desty/2 && (x-x1)*(x-x1)+(y-y1)*(y-y1)>r*r){
               continue;
               }
               if(x>x2 && y<y2 && r<destx/2 && r<desty/2 && (x-x2)*(x-x2)+(y-y2)*(y-y2)>r*r){
               continue;
               }
               if(x<x3 && y>y3 && r<destx/2 && r<desty/2 && (x-x3)*(x-x3)+(y-y3)*(y-y3)>r*r){
               continue;
               }
               if(x>x4 && y>y4 && r<destx/2 && r<desty/2 && (x-x4)*(x-x4)+(y-y4)*(y-y4)>r*r){
               continue;
               }
               
               
               
               lcd[y*800*4 + x*4 + 0] = zoom_bmp[(desty-1-(y-starty))*destx*3 + (x-startx)*3 + 0]; // R  desty-1-y 实现上下倒转
               lcd[y*800*4 + x*4 + 1] = zoom_bmp[(desty-1-(y-starty))*destx*3 + (x-startx)*3 + 1]; // G
               lcd[y*800*4 + x*4 + 2] = zoom_bmp[(desty-1-(y-starty))*destx*3 + (x-startx)*3 + 2]; // B
               lcd[y*800*4 + x*4 + 3] = 0;                                                         // A

            }
        }

        if(y >= desty + starty)
           break;  
    }

    //  将lcd数组的数据写入到lcd屏
    write(lcd_fd, lcd, 800*480*4);

    //lcd_close();
    //bmp_close();

    //return 0;
}

int find_video(char *dir_name2)
{   
    // char name[256]; // 一次只能存放一个字符串（一个数组只能存放一个名字）
    
    int i = 0 ; //一维数组下标
    rs = 0;
    re = 0;
    
    DIR *dp2 = opendir(dir_name2);

    if(dp2 == NULL)
    {
        printf("打开目录失败 \n");
        return -1;
    }

    chdir(dir_name2);

    struct dirent *ep2 = NULL ; // 接受目录下文件信息

    while (1)
    {   
        // 获取目录文件信息
        ep2 = readdir(dp2);

        if(ep2 == NULL) // 判断是否读取完毕
        {
            break;
        }

        if(ep2 -> d_name[0] == '.') // 跳过当前文件夹以及上一级文件夹
        {
           continue;
        }

        if(ep2 -> d_type == 8 && strstr(ep2 -> d_name , ".avi"))
        {
            printf("d_name2 = %s \n", ep2 -> d_name);
            printf("d_type2 = %d \n", ep2 -> d_type);

            strcpy(name2[i], ep2 -> d_name);
            i++;

        }

    }
    
    printf("------------------------------------------------\n");
    
    for(avi_n=0; avi_n < i; avi_n++)
        printf("name2 = %s\n", name2[avi_n]);

    printf("------------------------------------------------\n");

    lcd_init();
    
    // 触摸
    while (1)
    {    
        //printf("%d\n",rs);
        if (LEFT == rs || re == Ls)
        {   
            rs = 0;
            re = 0;
            if (avi_n == i)
            {
                avi_n = 0;
            }
            else
            {
                ++avi_n;
            }
            system("killall -9 mplayer");
            sleep(1);            
            sprintf(mvavi,"mplayer -slave -quiet -af volume=%d -zoom -x %d -y %d %s &", 23, 800, 480, name2[avi_n]);
            system(mvavi);

        }
  
        else if (RIGHT == rs || re == Rs)
        {   
            rs = 0;
            re = 0;
            if (avi_n == 0)
            {
                avi_n = i-1;
            }
            else
            {
                --avi_n;
            }
            system("killall -9 mplayer");
            sleep(1);
            sprintf(mvavi,"mplayer -slave -quiet -af volume=%d -zoom -x %d -y %d %s &", 23, 800, 480, name2[avi_n]);
            system(mvavi);
        }


        else if (re == Ds || rs == DOWN)
        {
            rs = 0;
            re = 0;
            system("killall -9 mplayer");
            sleep(1);            
            flag_mv = 0;
            break;
        }
        
        else if (rs == AXIS)
        {   
            if (x_endx < 200)
            {
                rs = 0;
                system("killall -18 mplayer");
                sleep(1);
            }

            if (x_endx > 800)
            {
                rs = 0;
                system("killall -19 mplayer");
                sleep(1);
            }
            

        }
        
    }
 
    manual();
    lcd_close();
    closedir(dp2);

    return 0;
}

int find_bmp(char *dir_name)
{   
    // char name[256]; // 一次只能存放一个字符串（一个数组只能存放一个名字）
    
    int i = 0 ; //一维数组下标
    rs = 0;
    re = 0;

    DIR *dp = opendir(dir_name);

    if(dp == NULL)
    {
        printf("打开目录失败 \n");
        return -1;
    }

    chdir(dir_name);

    struct dirent *ep = NULL ; // 接受目录下文件信息

    while (1)
    {   
        // 获取目录文件信息
        ep = readdir(dp);

        if(ep == NULL) // 判断是否读取完毕
        {
            break;
        }

        if(ep -> d_name[0] == '.') // 跳过当前文件夹以及上一级文件夹
        {
           continue;
        }

        if(ep -> d_type == 8 && strstr(ep -> d_name , ".bmp"))
        {
            printf("d_name = %s \n", ep -> d_name);
            printf("d_type = %d \n", ep -> d_type);

            strcpy(name[i], ep -> d_name);
            i++;

        }

    }
    
    printf("------------------------------------------------\n");
    
    for(bmp_n=0; bmp_n < i; bmp_n++)
        printf("name = %s\n", name[bmp_n]);

    printf("------------------------------------------------\n");

    lcd_init();
    
    // 触摸
    while (1)
    {    
        //printf("%d\n",rs);
        if (LEFT == rs || re == Ls)
        {   
            rs = 0;
            re = 0;
            if (bmp_n == i)
            {
                bmp_n = 0;
            }

            else
            {
                ++bmp_n;
            }
            bmp_boom_xy(name[bmp_n],800,480,0,0,0);
            bmp_boom_xy(name[bmp_n],800,480,0,0,0);
        }
  
        else if (RIGHT == rs || re == Rs)
        {   
            rs = 0;
            re = 0;
            if (bmp_n == 0)
            {
                bmp_n = i-1;
            }

            else
            {
                --bmp_n;
            }
            bmp_boom_xy(name[bmp_n],800,480,0,0,0);
            bmp_boom_xy(name[bmp_n],800,480,0,0,0);
            printf("%s %d",name[bmp_n-1], bmp_n);
        }

        else if (DOWN == rs || re == Ds)
        {
            rs = 0;
            re = 0;
            flag_album = 0;
            break;
            
        }
        
    }
    
    manual();
    lcd_close();
    closedir(dp);

    return 0;
}

int Camera()//void *Camera(void *arg)
{
    lcd_init();
    // int touch_fd = *(int *)arg;
    
    flag_camera = 1; 

    // 开启映射区域 不指定起始区域 指定映射空间的大小  进行操作保护（读和写）选用共享模式文件描述符 非偏移
    unsigned int *lcdmem = (unsigned int *)mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd_fd,0);
    if(lcdmem == MAP_FAILED)
    {
    perror("lcd mmap");
    return -1;
    }

    // 申请一片堆空间(获取这个摄像头的一些基本数据)
    camera_t *camera = malloc(sizeof(camera_t));

    yuvcamera_init(camera, CAMERAPATH);
    printf("宽：%d   高：%d\n", camera->width, camera->height);

    // 按照摄像头采集数据的宽高进行堆空间的申请
    unsigned char *rgbbuf = malloc(camera->width*camera->height*3);

    

    // 进行摄像头的采集工作
    while(flag_camera)
    {
    

    if ((rs == RIGHT || re == Rs))
     {
        yuvcamera_getrgb(camera, rgbbuf);
        yuvcamera_show(camera, lcdmem, rgbbuf);
     }
    
    else if (rs == LEFT)
    {
        rs = 0;
        // 将采集到的数据保存成jpg图片模式(这一步是必须放在这个位置，不然图片保存失败)
        yuvcamera_save("/test.jpg", rgbbuf, camera);
        printf("截图已保存\n");
    }
    
    else if (re == Ls)
    {
        re = 0;
        // 将采集到的数据保存成jpg图片模式(这一步是必须放在这个位置，不然图片保存失败)
        yuvcamera_save("/test_ss.jpg", rgbbuf, camera);
        printf("截图已保存2\n");
    }

    else if (rs == DOWN || re == Ds)
    {
        // 摄像头和内存映射都进行关闭
        rs = 0;
        re = 0;
        munmap(lcdmem, 800*480*4);
        yuvcamera_close(camera);
        close(lcd_fd);
        flag_camera = 0;
        break;
        
    }

    }

    
    manual();
    //pthread_exit(NULL);
}

// int Mv()//void *Mv(void *arg)
// {   
//     flag_mv = 1;

//     while (flag_mv)
//     {   
//         if (re == Rs || rs == RIGHT)
//         {   
//             rs = 0;
//             re = 0;
//             sleep(1);
//             system("killall -9 mplayer");
//             //system("mplayer -slave -quiet -af volume=23 -zoom -x 800 -y 480 /usr/bin/zhiyi.avi &");
//             find_video();
//         }

//         if (re == Ls || rs == LEFT)
//         {  
//             rs = 0;
//             re = 0;
//             sleep(1);
//             system("killall -9 mplayer");
//             //system("mplayer -slave -quiet -af volume=23 -zoom -x 800 -y 480 /usr/bin/faded3.avi &");
//             find_video();
//         }

//         if (re == Ds || rs == DOWN)
//         {
//             sleep(1);
//             system("killall -19 mplayer");
//             flag_mv = 0;
//             manual();
//         }
        
//         if (rs == AXIS)
//         {   
//             if (x_endx < 200)
//             {
//                 sleep(1);
//                 system("killall -18 mplayer");
//             }

//             if (x_endx > 800)
//             {
//                 sleep(1);
//                 system("killall -19 mplayer");
//             }
            

//         }
//     }
// }



// // 相册操作栏
// int album_control()
// {
//     bmp_boom_xy("exit.bmp",100,100,680,360,10);
//     bmp_boom_xy("exit.bmp",100,100,680,360,10);

//     while (1)
//     {
//         if(rs = 5)
//         {
//         x_endx = x_end;
//         y_endy = y_end;
//         //printf("hello=(%d,%d)\n", x_endx, y_endy);

//         if((x_endx > 900 && x_endx < 1020) && (y_endy > 480 && y_endy < 580))
//         {
//             printf("退出相册\n");
//             sleep(2);
//             break;
//         }
        
//         }

//     }  
// }





// 菜单栏
int manual()
{  
    addr = 1;

    bmp_boom_xy("/03.bmp",800,480,0,0,0);
    bmp_boom_xy("/03.bmp",800,480,0,0,0);
    bmp_boom_xy("/album.bmp",100,100,20,20,25);
    bmp_boom_xy("/album.bmp",100,100,20,20,25);
    bmp_boom_xy("/camera.bmp",100,100,140,20,25);
    bmp_boom_xy("/camera.bmp",100,100,140,20,25);
    bmp_boom_xy("/mv.bmp",100,100,260,20,25);
    bmp_boom_xy("/mv.bmp",100,100,260,20,25);
    bmp_boom_xy("/exit.bmp",100,100,680,360,10);
    bmp_boom_xy("/exit.bmp",100,100,680,360,10);

    while(addr)
    {

    //rs = 0;
    //re = 0;

    
    
    if(rs == AXIS)
    {
        x_endx = x_end;
        y_endy = y_end;

        //printf("hello=(%d,%d)\n", x_endx, y_endy);
    
        // 触发压力事件选择是否进入相册
        if((x_endx > 60 && x_endx < 100) && (y_endy > 60 && y_endy < 100))
        {
            //addr = 2;
            printf("进入相册\n");
            bmp_boom_xy("/guidence.bmp",800,480,0,0,0);
            bmp_boom_xy("/guidence.bmp",800,480,0,0,0);
            find_bmp(ROOT_PATH);
            if(flag_album == 0)
            {
               flag_album = 1;
               break;
            }
            // 相册操作栏
            //album_control();
        }
        
        // 摄像头
        else if((x_endx > 220  && x_endx < 250) && (y_endy > 60 && y_endy < 100))
        {
            //addr = 3;
            printf("进入摄像头\n");
            bmp_boom_xy("/guidence.bmp",800,480,0,0,0);
            bmp_boom_xy("/guidence.bmp",800,480,0,0,0);
            Camera();
            if(flag_camera == 0)
            {
               flag_camera = 1;
               break;
            }
            //pthread_create(&pth_id_camera, NULL, , &lcd_fd);
            //void *func2(void *arg);

        }
        
        // 视频播放器
        else if((x_endx > 365 && x_endx < 395) && (y_endy > 60 && y_endy < 100))
        {
            //addr = 4;
            printf("进入视频播放器\n");
            bmp_boom_xy("/guidence.bmp",800,480,0,0,0);
            bmp_boom_xy("/guidence.bmp",800,480,0,0,0);
            find_video(AVI_PATH);
            if(flag_mv == 0)
            {
               flag_mv = 1;
               break;
            }
            //pthread_create(&pth_id_camera, NULL, Camera, &touch_fd);
            //void *func4(void *arg);
        }
        
        // 退出
        else if((x_endx > 900 && x_endx < 1020) && (y_endy > 480 && y_endy < 580))
        {
            printf("退出系统\n");
            bmp_boom_xy("/Xman.bmp",800,480,0,0,0);
            bmp_boom_xy("/Xman.bmp",800,480,0,0,0);
            sleep(5);
            lcd_color(color_black);
            lcd_color(color_black);
            rs = 0;
            re = 0;
            break;
            return addr = 100;
        }
    }
    
    
    
    }

    close(lcd_fd);
}



// 主函数
int main(void)
{   
    touch_init();

    // 锁屏
    bmp_boom_xy("/test54.bmp",800,480,0,0,0);
    bmp_boom_xy("/test54.bmp",800,480,0,0,0);

    // read(touch_fd, &ts, sizeof(ts));
    pthread_create(&pth_id_touch, NULL, GetDirection, &touch_fd);
    pthread_create(&pth_id_ss, NULL, Gesture, &IIC_fd);

    //sleep(10);

    // 解锁
    while(1)
    {  
        addr = 100;
        
        while(addr)
        {
        if(rs == RIGHT || re == Rs)
        {
            printf("已解锁\n");
            manual();
            
            
        }
        }
    
    }
    

    pthread_join(pth_id_touch, NULL);
    //pthread_join(pth_id_camera, NULL);
    pthread_join(pth_id_ss, NULL);
    //pthread_join(pth_id_mv, NULL);

    return 0;
}